<?php

namespace app\common\controller;

use think\Controller;
use think\facade\Env;
use Yansongda\Pay\Pay;
use Yansongda\Pay\Log;

class Wxpay extends Controller
{

    //$order_no 订单号
    //$money 支付金额
    //$content// 备注
    //$way//支付方式
    //$url 回调地址
    public function index($order_no,$money,$content,$openid='',$way,$url)
    {
        //        mp	公众号支付	array $order	Collection
        //wap	手机网站支付	array $order	Response
        //app	APP 支付	array $order	JsonResponse
        //pos	刷卡支付	array $order	Collection
        //scan	扫码支付	array $order	Collection
        //transfer	账户转账	array $order	Collection
        //miniapp	小程序支付	array $order	Collection
        //redpack	普通红包	array $order	Collection
        //groupRedpack	裂变红包	array $order	Collection
        $config = [
             'appid' => config('appid'), // APP APPID
            'app_id' => config('app_id'), // 公众号 APPID
            'miniapp_id' => config('miniapp_id'), // 小程序 APPID
            'mch_id' => config('mch_id'),
            'key' => config('mchid_key'),
            'notify_url' => url($url,'','',true), // 支付宝异步通知地址 ,
            //'cert_client' => './cert/apiclient_cert.pem', // optional，退款等情况时用到
            //'cert_key' => './cert/apiclient_key.pem',// optional，退款等情况时用到
            'log' => [ // optional
                'file' => './logs/wechat.log',
                'level' => 'info', // 建议生产环境等级调整为 info，开发环境为 debug
                'type' => 'single', // optional, 可选 daily.
                'max_file' => 30, // optional, 当 type 为 daily 时有效，默认 30 天
            ],
            'http' => [ // optional
                'timeout' => 5.0,
                'connect_timeout' => 5.0,
                // 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
            ],
            'mode' => 'normal', // optional, dev/hk;当为 `hk` 时，为香港 gateway。
        ];
        if(!in_array($way,['wap','miniapp'])){
            $openid='';
        }
        $order = [
            'out_trade_no' => $order_no,
            'total_fee' => $money*100, // **单位：分**
            'body' => $content,
            'openid' => $openid,
        ];
        $wechatpay = Pay::wechat($config);
        if($way=='mp'){
            return $wechatpay->mp($order);
        }else if($way=='wap'){
            return $wechatpay->wap($order)->send();
        }else if($way=='app'){
            return $wechatpay->app($order)->send();
        } else if($way=='miniapp'){
            return $wechatpay->miniapp($order);
        } else if($way=='scan'){

            return $wechatpay->scan($order)->getContent();
        }

        // $pay->appId
        // $pay->timeStamp
        // $pay->nonceStr
        // $pay->package
        // $pay->signType
    }

    public function refund($order_no,$money,$tui_money,$tui_orderno,$way,$appid)
    {
        //        mp	公众号支付	array $order	Collection
        //wap	手机网站支付	array $order	Response
        //app	APP 支付	array $order	JsonResponse
        //pos	刷卡支付	array $order	Collection
        //scan	扫码支付	array $order	Collection
        //transfer	账户转账	array $order	Collection
        //miniapp	小程序支付	array $order	Collection
        //redpack	普通红包	array $order	Collection
        //groupRedpack	裂变红包	array $order	Collection
        $config = [
            //'appid' =>config('appid'), // APP APPID
            'appid' =>$appid, // APP APPID
            'app_id' => config('app_id'), // 公众号 APPID
            'miniapp_id' => config('miniapp_id'), // 小程序 APPID
            'mch_id' => config('mch_id'),
            'key' => config('mchid_key'),
            //'notify_url' => url($url,'','',true), // 支付宝异步通知地址 ,
            'cert_client' => Env::get('app_path').'common/payment/cert/apiclient_cert.pem', // optional，退款等情况时用到
            'cert_key' => Env::get('app_path').'common/payment/cert/apiclient_key.pem',// optional，退款等情况时用到
            'log' => [ // optional
                'file' => './logs/wechat.log',
                'level' => 'info', // 建议生产环境等级调整为 info，开发环境为 debug
                'type' => 'single', // optional, 可选 daily.
                'max_file' => 30, // optional, 当 type 为 daily 时有效，默认 30 天
            ],
            'http' => [ // optional
                'timeout' => 5.0,
                'connect_timeout' => 5.0,
                // 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
            ],
            'mode' => 'normal', // optional, dev/hk;当为 `hk` 时，为香港 gateway。
        ];
        if($way=='JSAPI'){
            $way='miniapp';
        }else{
            $way='app';
        }
        $tui_money=(float)$tui_money;
        $order = [
            'out_trade_no' => $order_no,
            'out_refund_no' => $tui_orderno,
            'total_fee' => $money*100,
            'refund_fee' => $tui_money*100,
            'refund_desc' => '订单退款',
            'type' =>$way
        ];
        $wechatpay = Pay::wechat($config);
        $result = $wechatpay->refund($order);
        return $result;
    }
    public function notify($arr)
    {
        $config = [
            'appid' => config('appid'), // APP APPID
            'app_id' => config('app_id'), // 公众号 APPID
            'miniapp_id' => config('miniapp_id'), // 小程序 APPID
            'mch_id' => config('mch_id'),
            'key' => config('mchid_key'),
            //'notify_url' => url($url,'','',true), // 支付宝异步通知地址 ,
            'cert_client' => Env::get('app_path').'common/payment/cert/apiclient_cert.pem', // optional，退款等情况时用到
            'cert_key' => Env::get('app_path').'common/payment/cert/apiclient_key.pem',// optional，退款等情况时用到
            'log' => [ // optional
                'file' => './logs/wechat.log',
                'level' => 'info', // 建议生产环境等级调整为 info，开发环境为 debug
                'type' => 'single', // optional, 可选 daily.
                'max_file' => 30, // optional, 当 type 为 daily 时有效，默认 30 天
            ],
            'http' => [ // optional
                'timeout' => 5.0,
                'connect_timeout' => 5.0,
                // 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
            ],
            'mode' => 'normal', // optional, dev/hk;当为 `hk` 时，为香港 gateway。
        ];
        $pay = Pay::wechat($config);

        try{
            $data = $pay->verify($arr); // 是的，验签就这么简单！
            if($data){
                return  true;
            }
            Log::debug('Wechat notify', $data->all());
        } catch (\Exception $e) {
            return  $e->getMessage();
            //
        }
    }
}